#ifndef ASFINGER_PBRPC_CORE_RPC_GENERATOR_H_
#define ASFINGER_PBRPC_CORE_RPC_GENERATOR_H_

#include <memory>
#include <string>
#include <vector>

#include "core/config.h"
#include "core/struct_interface.h"

namespace asfinger {
namespace pbrpc {

/*!
 * 命令行解析的所有参数
 */
struct Parameters {
  std::string services_namespace; /*!< 将服务放入命名空间 */
  bool use_system_headers{false}; /*!< 是否使用系统路径(<>) 默认本地("") */
  std::string rpc_search_path; /*!< rpc前缀包含 */

  std::vector<std::string> additional_header_includes; /*!< 包含其他文件 */
};

/*!
 * 返回生成的头文件的序言。
 * @param file 文件
 * @param params 参数
 * @return 返回生成的头文件的序言。
 */
std::string GetHeaderPrologue(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的头文件所需的包含
 * @param file 文件
 * @param params 参数
 * @return 返回生成的头文件所需的包含。
 */
std::string GetHeaderIncludes(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的头文件的服务
 * @param file 文件
 * @param params 参数
 * @return 返回生成的头文件的服务。
 */
std::string GetHeaderServices(FileInterface *file,
                              const Parameters &params);

/*!
 *
 * @param file 文件
 * @param params 参数
 * @return 返回生成的头文件的结尾。
 */
std::string GetHeaderEpilogue(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的源文件的序言
 * @param file 文件
 * @param params 参数
 * @return 返回生成的源文件的序言。
 */
std::string GetSourcePrologue(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的源文件所需的包含
 * @param file 文件
 * @param params 参数
 * @return 返回生成的源文件所需的包含。
 */
std::string GetSourceIncludes(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的源文件的服务
 * @param file 文件
 * @param params 参数
 * @return 返回生成的源文件的服务。
 */
std::string GetSourceServices(FileInterface *file,
                              const Parameters &params);

/*!
 * 返回生成的源文件的结尾
 * @param file 文件
 * @param params 参数
 * @return 返回生成的源文件的结尾。
 */
std::string GetSourceEpilogue(FileInterface *file,
                              const Parameters &params);

} //! namespace pbrpc
} //! namespace asfinger

#endif //ASFINGER_PBRPC_CORE_RPC_GENERATOR_H_